#pragma once
#include <unordered_map>
#include <string>
#include <vector>
#include "tinyrpc/net/inetaddress.h"
#include "redis/redisclient.h"
namespace TinyRPC{

struct ServiceInfo;
/**
 * 
 * 注册服务
 * key      field        value
 * Service                    
 *          ip1:port1    1
 *          ip2:port2    2
 *    
 * TinyRPC:Service    ip1:port1  count   exprietime1
 * TinyRPC:Service    ip1:port1    exprietime2
 * 
 * 利用发布订阅模式，+ 键空间通知 监听 service 的增加, 过期删除
 * 
 * 服务器 上线时， 先将自己的 ip:port 填入对应的Service列表里面
 *       监听Service里面所有的服务器， 如果某一个过期了，就将其Service列表里面删除
 *       监听Service列表  如果里面有添加， 则将其缓存下来, 监听
 *        服务器每隔一段时间， 就将发送心跳， 更新自己的exprietime1, 
 * 
 * 客户端 上线时,  先将其Service列表里面缓存下来
 *         监听， 监听Service列表  如果里面有添加， 则将其缓存下来， 如果有删除， 就在自己的缓存里面删除
 * 
 */
const std::string KeyPrefix = "TinyRPC:";
class RedisRegister{
public:
    RedisRegister();
    void init(const std::string& ip, uint32_t port){
        m_redisClient.init(ip, port);
    }
    void regist(std::unordered_map<std::string, ServiceInfo>& serviceMap, const INetAddress& serverAddress);
    void subscribe();
    void heartbeat();
private:

    std::unordered_map<std::string, std::string> m_serviceList;
    RedisClient m_redisClient;
    bool m_quit;
    std::vector<std::string> m_subscribeChannels;
};
}